盒子
盒子
文章目录
  1. 使用镜像
    1. Dockerfile 指令详解
    2. 其他制作镜像的方式
    3. 删除本地镜像
  2. 操作容器
    1. 启动
    2. 守护态运行
    3. 终止
    4. 进入容器
    5. 导出和导入
    6. 删除容器
  3. 建立一个 mc 服务器镜像
    1. Kitematic 上的 Dockerfile

Docker 学习日记 Day2

使用镜像

Dockerfile 指令详解

COPY
COPY <源路径>… <目标路径>
COPY [“<源路径1>”,… “<目标路径>”]

ADD:ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。比如 <源路径> 可以是一个 URL,如果 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去

遵循这样一个原则: 所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD

CMD
shell 格式:CMD <命令>
exec 格式:CMD [“可执行文件”, “参数1”, “参数2”…]
参数列表格式:CMD [“参数1”, “参数2”…]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数

在指令格式上,一般推荐使用 exec 格式,这类格式在解析时会被解析为 JSON 数组,因此一定要使用双引号 “,而不要使用单引号

ENTRYPOINT:ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。ENTRYPOINT 在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过 docker run 的参数 –entrypoint 来指定。
当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为:< ENTRYPOINT > “< CMD >”

ENV
ENV < key > < value >
ENV < key1 >=< value1 > < key2 >=< value2 >…
这个指令很简单,就是设置环境变量而已,无论是后面的其它指令,如 RUN,还是运行时的应用,都可以直接使用这里定义的环境变量。可用\换行

ARG:ARG <参数名>[=<默认值>]
构建参数和 ENV 的效果一样,都是设置环境变量。所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的

VOLUME
VOLUME [“<路径1>”, “<路径2>”…]
VOLUME <路径>

EXPOSE:EXPOSE <端口1> [<端口2>…]

EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口
要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射

WORKDIR:WORKDIR <工作目录路径>
使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录

USER:USER <用户名>
USER 指令和 WORKDIR 相似,都是改变环境状态并影响以后的层。WORKDIR 是改变工作目录,USER 则是改变之后层的执行 RUN, CMD 以及 ENTRYPOINT 这类命令的身份。当然,和 WORKDIR 一样,USER 只是帮助你切换到指定用户而已,这个用户必须是事先建立好的,否则无法切换

HEALTHCHECK
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

–interval=<间隔>:两次健康检查的间隔,默认为 30 秒;
–timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
–retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。

为了帮助排障,健康检查命令的输出(包括 stdout 以及 stderr)都会被存储于健康状态里,可以用 docker inspect 来查看。

ONBUILD:ONBUILD <其它指令>
ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行

其他制作镜像的方式

  1. 从 rootfs 压缩包导入
    docker import [选项] <文件>||- [<仓库名>[:<标签>]]
  2. docker save

删除本地镜像

docker rmi [选项] <镜像1> [<镜像2> …]

注意 docker rm 命令是删除容器,不要混淆

操作容器

启动

  1. 第一种方式:基于镜像新建一个容器并启动
    docker run
  2. 第二种方式:将在终止状态(stopped)的容器重新启动
    docker start

守护态运行

-d使 Docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下
要获取容器的输出信息,可以通过 docker logs 命令

终止

可以使用 docker stop 来终止一个运行中的容器
此外,当Docker容器中指定的应用终结时,容器也自动终止

进入容器

在使用 -d 参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括使用 docker attach 命令或 nsenter 工具等。

docker attach: 使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了
nsenter:nsenter 启动一个新的shell进程(默认是/bin/bash), 同时会把这个新进程切换到和目标(target)进程相同的命名空间,这样就相当于进入了容器内部。
为了连接到容器,你还需要找到容器的第一个进程的 PID
可以$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
$ echo “[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker” >> ~/.bashrc; source ~/.bashrc
直接下载 .bashrc_docker,并将内容放到 .bashrc 中,就可以用docker-pid 可以获取某个容器的 PID;而 docker-enter 可以进入容器或直接在容器内执行命令。

导出和导入

导出容器:docker export
导入容器:
docker import 丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态)
docker load 保存所有状态

删除容器

docker stop
docker rm


建立一个 mc 服务器镜像

Kitematic 上的 Dockerfile

  1. FROM debian:wheezy 指定基础镜像 debian,版本 wheezy
  2. RUN apt-get -y update
    RUN apt-get -y install openjdk-7-jre-headless wget
    配置 jre 环境,因为 mc 是用 java 写的
  3. RUN wget -q https://s3.amazonaws.com/Minecraft.Download/versions/1.11.2/minecraft_server.1.11.2.jar 下载 mc
  4. WORKDIR /data
    VOLUME /data
    设置工作路径及数据卷路径
  5. EXPOSE 25565 声明容器提供服务端口
  6. CMD echo eula=true > /data/eula.txt && java -jar /minecraft_server.1.11.2.jar 设置 eula 为 true,即同意最终用户许可协议,并且启动服务器